package com.summer.aop.Proxy;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//对于动态代理都应该有这样一个模型
public class DynamicProxyObj {
	Object target = null;//委托对象
	
	public DynamicProxyObj(Object target){
		this.target = target;//关联委托
	}
	
	public Object invoke(Method method,Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//实际上的动态代理只是使用反射区调用了原本委托对象的方法~~
		//这里我们可以做统计了
		count();
		return method.invoke(target, args);//调用目标行为，实际可以看出这里用了反射，并且使用了对象是真实调用的代理
	}
	
	public void count(){
		System.out.println("这里做了统计");
	}
	
	
	public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
		TestObj target = new TestObj();
		target.todo1();
		
		DynamicProxyObj dynamicProxyObj = new DynamicProxyObj(target);
		dynamicProxyObj.invoke(TestObj.class.getDeclaredMethod("todo1"));//可以看出这里调用的方式并不好看是用反射调用。
		//动态代理的原理是这样实现的，但是我们需要做一个外观，给代理调用，这里我就不实现了，我直接用JDK的动态代理来做。
	}
}
